/*
 * @Author: quit
 * @Date: 2021-11-09 16:01:11
 * @LastEditTime: 2021-12-30 11:23:38
 * @Descripttion: Axios请求配置
 */
import axios from 'axios'
import store from '@/store'
import { Notification } from 'element-ui'
// 创建一个axios实例
const service = axios.create({
    // 请求基础地址为项目环境变量中进行设置,请注意在启动设置中配置了反向地址代理(处理开发环境跨域) '/api'
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 5000 // 请求丢失响应时间
})

// 请求拦截器,用于添加请求信息与失败的请求返回
service.interceptors.request.use(
    // 请求配置信息
    config => {
        // 判断VueX中是否有Token,有就在请求头中添加对应的Token字段并赋值
        if (store.getters.token) {
            config.headers['Token'] = store.getters.token
        } else {
            config.headers['Token'] = '2BD7617FD176E0D55D9D940D5060A2D8'
        }
        return config
    },
    // 请求失败
    error => {
        console.log(error) // for debug
        return Promise.reject(error)
    }
)

// 响应拦截器,请求成功后处理服务器返回数据,后续不需要在页面调用中继续错误判断
service.interceptors.response.use(
    response => {
        // Axios会默认包装一层data数据,进行数据解构
        const res = response.data
        // 在结构数据后,可以进行数据处理(根据返回的响应状态进行数据返回)
        if (res.success) {
            return res
        } else {
            Notification({
                title: '数据请求错误',
                type: 'warning',
                position: 'bottom-right',
                duration: 4500,
                dangerouslyUseHTMLString: true,
                message: res.message,
                showClose: true
            })
            // 错误必须进行reject,这里并没有错误对象，所以手动添加一个错误对象
            return Promise.reject(new Error(res.message))
        }
    },
    // 返回错误信息
    error => {
        if (error.code === 'ECONNABORTED') {
            Notification({
                title: '数据请求丢失',
                type: 'error',
                position: 'bottom-right',
                duration: 4500,
                dangerouslyUseHTMLString: true,
                message: '当前请求超过超时时间:5000ms',
                showClose: true
            })
        } else {
            Notification({
                title: '数据请求失败',
                type: 'error',
                position: 'bottom-right',
                duration: 4500,
                dangerouslyUseHTMLString: true,
                message: error,
                showClose: true
            })
        }
        return Promise.reject(error)
    }
    // 未做token过期判断
)

export default service
